使用Perl替换正则表达式

您所在的位置:网站首页 trans用法 lisp 使用Perl替换正则表达式

使用Perl替换正则表达式

2023-03-06 17:42| 来源: 网络整理| 查看: 265

我正在尝试使用perl替换正则表达式。我在perl中使用了sed,但是它似乎不起作用。

要在文件trans.xml中替换的示例行

"公平"和"效率"

我需要将"效率"替换为"效率"

我尝试了以下代码,

12system"sed -e 's/\\&\\#x0027\\;\\([a-zA-Z0-9 _]*\\)\\&\\#x2019\\;/tooch&/g' trans.xml > tmp.xml"; system"sed -e 's/tooch\\&\\#x0027\\;/\\&\\#x2018\\;/g' tmp.xml > trans.xml"

上面的sed命令可以手动运行,但不能在Perl内部运行。

任何帮助将不胜感激!!

相关讨论 为什么在Perl中调用sed?

您是双引号的受害者。

将system呼叫替换为say将使您更清楚地了解发生了什么:

12sed -e 's/ ([a-zA-Z0-9 _]*) /tooch&/g' trans.xml > tmp.xml sed -e 's/tooch / /g' tmp.xml > trans.xml

看看怎么了?没有反斜杠了。它们已经由Perl双引号解释,并且sed不能使用它们。

您的大小写要纠正起来有些棘手,因为您已经使用(并且需要)将单引号传递给sed。从理论上讲,您可以再逃脱一次所需的时间,但这容易出错。最好使用Perl的其他单引号功能:

12system q+sed -e 's/\\&\\#x0027\\;\\([a-zA-Z0-9 _]*\\)\\&\\#x2019\\;/tooch&/g' trans.xml > tmp.xml+; system q(sed -e 's/tooch\\&\\#x0027\\;/\\&\\#x2018\\;/g' tmp.xml > trans.xml);

我在第一行使用+作为分隔符,因为它恰好不在字符串本身中使用。我在第二行中使用普通括号,因为它们在那里100%清晰。

一些严重的问题:

为什么要呼叫sed?当然,在perl中可能很难执行IO,但是perl具有regexp的内置功能。

12345use Path::Tiny qw(path); my $content = path('trans.xml')->slurp; $content =~ s/bar/baz/g; $content =~ s/foo/bar/g; path('trans.xml')->spew( $content );

注意:如果trans.xml是UTF-8编码的,那么您要做的就是将slurp / spew替换为slurp_utf8 / spew_utf8。 VS sed,可能不了解unicode。

system尽可能避免使用字符串,由于多种原因,一个是您遇到的问题:报价很困难。

1system('sed', '-e', $regexp )

在可能的情况下是首选语法。请注意,您不能将其与重定向一起使用,但实际上并不需要。

不需要多次调用sed:

1sed 's/foo/bar/g;s/bar/baz/g'

这将同时应用两个表达式。

一旦实现了#3,就不需要临时文件:

1sed -i 's/foo/bar/g;s/bar/baz/g' $file

这将修改$file INPLACE

使用system时,可能要检查返回值。

相关讨论 谢谢。我避免使用sed并使用perl替代,它更快!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3